home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / cross / GBDK-2.0.lha / GBDK / examples / fprpn.c < prev    next >
C/C++ Source or Header  |  1998-10-01  |  1KB  |  105 lines

  1. #include <stdio.h>
  2.  
  3. #define MAXOP     40
  4. #define NUMBER    '0'
  5. #define STACKSIZE 40
  6.  
  7. UBYTE sp;
  8. float stack[STACKSIZE];
  9.  
  10. char s[MAXOP];
  11. UBYTE pos;
  12. float f;
  13.  
  14. void push(float f)
  15. {
  16.   if(sp < STACKSIZE)
  17.     stack[sp++] = f;
  18.   else
  19.     puts("Stack full");
  20. }
  21.  
  22. float pop()
  23. {
  24.   if(sp > 0)
  25.     return stack[--sp];
  26.   else
  27.     puts("Stack empty");
  28.   return 0.0;
  29. }
  30.  
  31. float top()
  32. {
  33.   if(sp > 0)
  34.     return stack[sp-1];
  35.   else
  36.     puts("Stack empty");
  37.   return 0.0;
  38. }
  39.  
  40. BYTE read_op()
  41. {
  42.   if(pos == 0) {
  43.     gets(s);
  44.   }
  45.  
  46.   while(s[pos] == ' ' || s[pos] == '\t')
  47.     pos++;
  48.  
  49.   if(s[pos] == '\0') {
  50.     pos = 0;
  51.     return('\n');
  52.   }
  53.  
  54.   if(!isdigit(s[pos]))
  55.     return(s[pos++]);
  56.  
  57.   f = s[pos] - '0';
  58.   while(isdigit(s[++pos])) {
  59.     BYTE i = s[pos] - '0';
  60.     f = 10.0 * f;
  61.     f += (float)i;
  62.   }
  63. /*     f = 10.0 * f + (float)(BYTE)(s[pos] - '0'); */
  64.  
  65.   return NUMBER;
  66. }
  67.  
  68. void main()
  69. {
  70.   BYTE type;
  71.   float op2;
  72.  
  73.   puts("FP RPN Calculator");
  74.   sp = 0;
  75.   pos = 0;
  76.  
  77.   while((type = read_op(s)) != 0) {
  78.     switch(type) {
  79.     case NUMBER:
  80.       push(f);
  81.       break;
  82.     case '+':
  83.       push(pop() + pop());
  84.       break;
  85.     case '*':
  86.       push(pop() * pop());
  87.       break;
  88.     case '-':
  89.       op2 = pop();
  90.       push(pop() - op2);
  91.       break;
  92.     case '/':
  93.       op2 = pop();
  94.       if(op2 != 0)
  95.     push(pop() / op2);
  96.       else
  97.     puts("Divide by 0");
  98.       break;
  99.     case '\n':
  100.       printf("==> %f\n", top());
  101.       break;
  102.     }
  103.   }
  104. }
  105.